package com.wx.gof.pattern.behavioral.visitor;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 封装作用于某种数据结构中的各种元素的从操作
 * 描述:
 * 封装某些作用于某种数据结构中各元素的操作，它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
 * 适用场景:
 * 1.一个数据结构包含很多类型对象
 * 2.数据结构与数据操作分离
 * 优点:
 * 1.增加新的操作很容易，新增一个新的访问者即可
 * 2.能够在不修改对象结构中的元素的情况下，为对象结构中的元素添加新的功能
 * 3.可以通过访问者来定义整个对象结构通用的功能，从而提高复用程度
 * 4.可以通过访问者来分离无关的行为，把相关的行为封装在一起，构成一个访问者，这样每一个访问者的功能都比较单一。
 * 缺点:
 * 1.不适用于对象结构中的类经常变化的情况，因为对象结构发生了改变，访问者的接口和访问者的实现都要发生相应的改变，代价太高
 * 理解:
 * 应用程序-访问者设计模式(数据加载 数据操作分离适合此模式，一般用的少)
 * @Date 2018-12-16-18:30
 */
public class Application {
    public static void main(String[] agrs){
        List<Course> courseList = new ArrayList<>();
        FreeCourse freeCourse = new FreeCourse();
        freeCourse.setName("java基础免费课程");
        ChargeCourse chargeCourse = new ChargeCourse();
        chargeCourse.setName("Java架构实战视频");
        chargeCourse.setPrice(1999.00);
        courseList.add(freeCourse);
        courseList.add(chargeCourse);
        IVisitor visitor = new Visitor();
        for (Course course : courseList) {
            course.runVisitor(visitor);
        }
    }
}
